package fasttext;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import fasttext.utils.IKSUtil;
import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class DataProcess {

    private static String pathPredix = "/Users/wengjunjie/lx/fastText_java/data";

    @Test
    public void dataToText() {
        // /Users/wengjunjie/works/ai-nlp/11data/1632652922606/刑期预测赛道一期数据_训练
        String path = "/Users/wengjunjie/works/ai-nlp/11data/1632652922606/train.txt";
        try {
            List<String> scanListPath = readFile02(path);
            int i = 0;
            for (String s : scanListPath) {
                s = replaceHtml(s);
                //数据加工处理

                JSONObject jsonObject = JSON.parseObject(s);
                int judge = jsonObject.getInteger("judge");
                int filename = jsonObject.getInteger("filename");
                String caseCause = jsonObject.getString("caseCause");
                String justice = jsonObject.getString("justice");
                System.out.println(i++ + "..caseCause=" + justice);
                String opinion = jsonObject.getString("opinion");
                String province = jsonObject.getString("province");

                //放大50倍  非法持有、私藏枪支、弹药罪
                int forNum = 1;
              /*  if (caseCause.equals("非法持有、私藏枪支、弹药罪")) {
                    forNum = 1 + 50;
                }*/
                for (int j = 0; j < forNum; j++) {
                    File file = new File(pathPredix + "/fastText_train.txt");
                    String justiceTmp = justice;
                    String opinionTmp = opinion;

                    try {
                        FileWriter fw = new FileWriter(file, true);
                        String content = caseCause + " "
                                + justiceTmp + " " +
                                opinionTmp + " " +
                                province;
                        content = IKSUtil.getString(content) + "    __label__" + judge + "\r\n";
                        fw.write(content);

                        fw.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }

            }
            System.out.println("aa");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * https://blog.csdn.net/luoyexuge/article/details/72677186
     */
    @Test
    public void train() throws Exception {
        long t = new Date().getTime();
        String[] text = {
                "supervised",
                "-input",
                "/Users/wengjunjie/lx/fastText_java/data/fasttext_train.txt",
                "-output", "/Users/wengjunjie/works/ai-nlp/11data/model_fast/faste.model", "-dim",
                "10", "-lr", "0.1", "-wordNgrams", "2", "-minCount", "1",
                "-bucket", "10000000", "-epoch", "5", "-thread", "4"};
        Main op = new Main();
        op.train(text);
        long tEnd = new Date().getTime();
        System.out.println((tEnd - t) / 1000.0);
    }

    /**
     * P@1: 0.761
     * R@1: 0.761
     * Number of examples: 121155
     * <p>
     * P@3: 0.313   （3的时候准确率）
     * R@3: 0.940
     * Number of examples: 121155
     * <p>
     * P@1: 0.317
     * R@1: 0.317
     * Number of examples: 186
     *
     * @throws Exception
     */
    @Test
    public void test() throws Exception {
        long t = new Date().getTime();
        FastText fasttext = new FastText();
        fasttext.loadModel("/Users/wengjunjie/works/ai-nlp/11data/model_fast/faste.model.bin");

        fasttext.test(new FileInputStream(new File("/Users/wengjunjie/lx/fastText_java/data/fasttext_train.txt")), 1);

    }


    /**
     * 读取一个文本 一行一行读取
     *
     * @param path
     * @return
     * @throws IOException
     */
    public static List<String> readFile02(String path) throws IOException {
        // 使用一个字符串集合来存储文本中的路径 ，也可用String []数组
        List<String> list = new ArrayList<String>();
        FileInputStream fis = new FileInputStream(path);
        // 防止路径乱码   如果utf-8 乱码  改GBK     eclipse里创建的txt  用UTF-8，在电脑上自己创建的txt  用GBK
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String line = "";
        while ((line = br.readLine()) != null) {
            // 如果 t x t文件里的路径 不包含---字符串       这里是对里面的内容进行一个筛选
            if (line.lastIndexOf("---") < 0) {
                list.add(line);
            }
        }
        br.close();
        isr.close();
        fis.close();
        return list;
    }

    private static String replaceHtml(String s) {
        //{"caseCause": "非法经营罪", "justice": "经审理查明，2011年至2013年，王×担任VICTORYMARKETINGLIMITED大中华区市场部总监、北京中夏融通国际教育咨询有限公司（办公地点为：北京市朝阳区建外SOHO16号楼1706号）负责人，让客户下载并注册未经批准的"VFX"平台，并以此经营炒黄金、外汇期货的业务，金额达人民币30万余元。被告人王×后被抓获归案。\n2013年8月8日，梁XX的投资款是124000人民币（2万美元），当时只汇了15400美元至王×香港汇丰银行卡上（×××），剩下的钱用于员工发工资了。王×给了我一个平台卡号（711026），让我进行交易。\n2013年11月27日，徐×通过建设银行投入20300美金至王×建设银行。2014年1月，徐×要求终止交易，王×说平台上的钱他自己用了，无法还给我和徐×。王×给我们打了一个欠条。\n2013年11月29日至2014年1月20日，户名为"jinhaixu"的客户在"VFXTraher"系统的操作情况，买入了"gbpusd、xauusd、eurusd、audusd、"。\n2012年5月26日，王×在香港汇丰银行以自己名义开立的"VictoryMarketingLtd"的账户（×××）资金往来情况，其中2013年8月9日存入美元15391.6元，2013年11月27日存入美元19984.06元。\n2011年7月左右，倪×让我在新西兰注册"VFX奥X国际"国际炒汇、炒黄金平台，网址"www。vmarkets。net"。VFX奥X国际的网站是倪×找人设计的。奥盛国际公司大中华区市场部总监的聘书是倪×给我的。倪×给我们一个监管账户可以看到客户购买的产品。中夏融通公司和元丰投资、营口百信都是VFX奥X国际的代理商。该平台能够链接FXDD马耳他交易商和LAMAX英国交易所。\n",
        // "opinion": "本院认为，被告人王×法制观念淡薄，违反国家规定，未经国家有关主管部门批准非法经营买卖黄金、外汇的期货业务，其行为已构成非法经营罪，依法应予惩处。北京市朝阳区人民检察院指控被告人王×犯非法经营罪的事实清楚，证据确实、充分，指控的罪名成立；唯指控的犯罪数额有误，本院根据现有证据依法予以变更。被告人王×关于自己没有非法经营的辩护意见，及其辩护人关于本案证据不足的辩护意见，缺乏事实依据，本院不予采纳。综上，根据被告人王×犯罪的事实、犯罪的性质、情节以及对于社会的危害程度，本院依照《中华人民共和国刑法》第二百二十五条、第六十一条、第四十五条、第四十七条、第五十二条、第五十三条之规定，",
        // "province": "北京市", "judge": 6, "filename": "18430542"}
        String tmp = s.split("justice")[1];
        String justice = tmp.split("opinion")[0];
        justice = justice.substring(4, justice.length() - 4);
        String justice2 = justice.replaceAll("\"", "");
        justice2 = justice2.replaceAll("\\\\", "");
        s = s.replace(justice, justice2);

        tmp = s.split("opinion")[1];
        String opinion = tmp.split("province")[0];
        opinion = opinion.substring(4, opinion.length() - 4);
        String opinion2 = opinion.replaceAll("\"", "");
        opinion2 = opinion2.replaceAll("\\\\", "");
        s = s.replace(opinion, opinion2);

        JSONObject json = JSONObject.parseObject(s);
        return s;
    }

    private static String buildData(String justice) {
        //https://blog.csdn.net/qq_27590277/article/details/120232244
        String res = justice;
        String[] zifurray = {".", ";", "?", ";", "!", "."};
        for (String s : justice.split("[： ， ； 。]")) {
            StringBuffer s1 = new StringBuffer(s);
            if (s.length() > 10) {
                // System.out.println(s);
                int ran1 = (int) (Math.random() * (s.length() / 3 - 1) + 1);
                int start = (int) (Math.random() * (ran1 - 1) + 1);
                for (int i = 0; i < ran1; i++) {
                    //总数里面取 ran1个随机数
                    int starAyyay = (int) (Math.random() * (zifurray.length));
                    s1.insert(start, zifurray[starAyyay]);
                    start = (int) (Math.random() * (s1.length() - start) + start);
                }
            }
            res = res.replace(s, s1.toString());
        }
        return res;
    }

    /**
     * 英媒称", "威廉", "王子", "圣诞节     key is:-0.045962136   value is:__label__stock
     * 人民网 辽宁 频道 人民网 沈阳 月 10   key is:-0.08134564   value is:__label__affairs
     * 盛大 诸葛辉 ： 用 创意 创造 需求 就 没有冬天   　 　 通信 信息 报   廖庆升   　 　 12 月 2   ==key is:-1.0233887   value is:__label__house
     *
     * @throws IOException
     */
    @Test
    public void predict() throws IOException {
        FastText fasttext = new FastText();
        String[] test = {"英媒称", "威廉", "王子", "圣诞节"};
        fasttext.loadModel("/Users/wengjunjie/works/ai-nlp/11data/model/faste.model.bin");
        List<Pair<Float, String>> list = fasttext.predict("盛大 诸葛辉 ： 用 创意 创造 需求 就 没有冬天   　 　 通信 信息 报   廖庆升   　 　 12 月 2 日 ， 盛大 公布 了 2008 年 第三季度 财报 ， 财报 显示 ， 盛大 第三季度 净 ".split(" "), 1);  //得到最大可能的六个预测概率
        for (Pair<Float, String> parir : list) {
            System.out.println("key is:" + parir.getKey() + "   value is:"
                    + parir.getValue());
        }
        System.out.println(Math.exp(list.get(0).getKey()));  //得到最大预测概率
    }

}
